package murllook

import (
	"strings"

	"goweb/ext/e"
	"goweb/ext/settings"
	"goweb/utils/commons"
	"goweb/utils/mysql"
)

type UrlLook struct {
	Id         string `json:"Id"  xorm:"pk notnull varchar(100) 'Id'"`
	Url        string `json:"Url"   xorm:"Url"`
	IP         string `json:"IP" xorm:"IP"`
	Keywords   string `json:"KeyWords" xorm:"KeyWords"`
	TimeOut    int    `json:"TimeOut" xorm:"TimeOut"`
	Method     string `json:"Method" xorm:"Method"` // get  post delete
	UserId     string `json:"User" xorm:"UserId"`
	ExpectCode string `json:"ExpectCode" xorm:"ExpectCode"`
	Note       string `json:"Note" xorm:"Note"`
	Data       string `json:"Data" xorm:"Data"`
	Tag        string `json:"Tag" xorm:"Tag"`
	MaxStep    int    `json:"MaxStep" xorm:"MaxStep"`
	Times      int    `json:"Times" xorm:"Times"`
}

/**
统计url的数据大小
*/
type CheckResult struct {
	Url     string `json:"Url"  xorm:"Url" `
	DataLen int    `json:"DataLen" xorm:"DataLen"` //返回的数据大小  每次更新这个大小  可以绘制这个url走的数据量大小
}

/**
接收每次url返回的数据
*/
type CheckResultLog struct {
	Id         int64  `json:"Id"`
	Url        string `json:"Url" xorm:"Url"`
	IP         string `json:"IP" xorm:"IP"`
	ExpectCode string `json:"ExpectCode" xorm:"ExpectCode"` //状态码
	Status     string `json:"Status" xorm:"Status"`         //是否异常状态
	DataLen    int    `json:"DataLen" xorm:"DataLen"`
}

/**
定时任务策略中
*/

type CronTask struct {
	Id  int64  `json:"Id"`
	Sep string `json:"Sep" xorm:"Sep"`
}

type CronTaskUrlRel struct {
	Uid string `json:"Id" xorm:"Uid"`  //url  id
	Cid string `json:"Cid" xorm:"Cid"` //taskcron id
}

/*
	添加任务列表
*/
func (u *UrlLook) AddUrlLookCronM(cid string) int {
	id := GetOrFindOneUrlLookByCron(u.Id)
	if id != "" {
		return e.ERROR_EXIST_TAG
	}

	sess := conf.MasterDB.NewSession()

	var err error
	if err = sess.Begin(); err != nil {
		return e.SUCCESS
	}
	ctul := CronTaskUrlRel{Uid: u.Id, Cid: cid}

	defer sess.Rollback()
	if !(mysql.CheckErrInsert(sess, u) && mysql.CheckErrInsert(sess, ctul)) {
		return e.ERROR
	}
	sess.Commit()
	sess.Close()

	//_, err := conf.MasterDB.Insert(u)
	//
	//if commons.CheckErr(err) {
	//	return e.SUCCESS
	//}
	return e.SUCCESS
}

/**
查询单个任务
*/

func GetOrFindOneUrlLookByCron(id string) string {
	look := new(UrlLook)
	_, err := conf.MasterDB.Where("Id=?", id).Get(look)

	if commons.CheckErr(err) {
		return look.Id
	}

	return conf.STRING_FLAG

}

/**
查询所有的任务
*/
func GetAllUrlLookByCron() []UrlLook {
	look := make([]UrlLook, 0)
	err := conf.MasterDB.Find(&look)
	if commons.CheckErr(err) && len(look) > 0 {
		return look
	}
	return nil
}

/**
affected, err := engine.Id(id).Update(user)
*/
func (u *UrlLook) UpdateUrlLookCronM() int {
	_, err := conf.MasterDB.Id(u.Id).Update(u)
	if commons.CheckErr(err) {
		return e.SUCCESS
	}

	return e.UPDATE_ERROR
}

/**
保存每次返回来的数据在数据库进行更新
*/

func (cl *CheckResultLog) SaveData() int {
	dataLen := getDataLen(cl.Url)
	result := CheckResult{Url: cl.Url, DataLen: cl.DataLen + dataLen}

	sess := conf.MasterDB.NewSession()

	var err error
	if err = sess.Begin(); err != nil {
		return e.SUCCESS
	}
	defer sess.Rollback()
	if !(mysql.CheckErrInsert(sess, cl) && mysql.CheckErrInsert(sess, result)) {
		return e.ERROR
	}
	sess.Commit()
	sess.Close()

	return e.UPDATE_ERROR
}

/**
获取之前的datalen大小
*/

func getDataLen(url string) int {
	cl := new(CheckResultLog)
	_, err := conf.MasterDB.Where("Url=?", strings.TrimSpace(url)).Get(cl)

	if commons.CheckErr(err) {
		return cl.DataLen
	}

	return 0
}

/**
添加定时策略组
*/

func (ct *CronTask) AddCronTaskM() int {
	_, err := conf.MasterDB.Insert(ct)
	if commons.CheckErr(err) {
		return e.SUCCESS
	}
	return e.ERROR
}

/**
更新
*/

func (ct *CronTask) UpdateUrlLookCronM() int {
	_, err := conf.MasterDB.Id(ct.Id).Update(ct)
	if commons.CheckErr(err) {
		return e.SUCCESS
	}

	return e.UPDATE_ERROR
}

/**
重新加载定时策略
*/

func GetCronTaskM() interface{} {
	ct := []CronTask{}
	/**
	per := []Permission{}
	find := conf.MasterDB.Find(&per)
	*/

	find := conf.MasterDB.Find(&ct)
	if commons.CheckErr(find) && len(ct) > 0 {
		return ct
	}
	return nil
}
